package depend

import (
	"github.com/sirupsen/logrus"
	"go.uber.org/dig"
)

var container = dig.New()

// 传入对象的构造方法，进行依赖注册, 依赖池保证每个依赖只会被构建一次
func Provide(constructor interface{}, opts ...dig.ProvideOption) {
	if err := container.Provide(constructor, opts...); err != nil {
		logrus.Fatal("provide dependency err : ", err)
	}
}

// 在依赖池中查找function所需依赖，作为参数传入其中，如果依赖尚未创建，则会依次进行依赖的构建
func Invoke(function interface{}, opts ...dig.InvokeOption) {
	// todo: 错误判断
	if err := container.Invoke(function, opts...); err != nil {
		logrus.Fatal("invoke dependency err : ", err)
	}
}

// 获得依赖池中，类型为T的对象
func Produce[T any]() T {
	var d T
	Invoke(func(driver T) {
		d = driver
	})
	return d
}
